package com.tlvip.arithmetic.ch01;

/**
 * <p>description：判断一个数是否是2的N次方</p>
 * <p>copyright： copyright(C)2016-2099</p>
 * <p>Life is short,we need passion</p>
 * <p>Summary： </p>
 * <p>instructions： </p>
 * Date 1/23/21</p>
 * Author mac
 *
 * @version 1.0
 */
public class Jude2N {
    public static void main(String[] args) {
        // 第一种算法
        for (int i = 1; i < 100; i++) {
            if (jude(i)) {
                System.out.println(i);
            }
        }
    }


    /**
     * 第二种算法，按位与运算
     * 1:01
     * 2:10  1 & 2 == 0
     *
     * 3:011
     * 4:100 3 & 4 == 0
     *
     * 7:0111
     * 8:1000  7 & 8 == 0
     *
     * 15:1111
     * 16:10000  15 & 16 == 0
     *
     * ......
     * 数字 与 数字 -1 与运算时是0
     * @param num
     * @return
     */
    private static boolean jude2(long num) {
        if (num == 1) {
            return true;
        }
        if ((num & (num - 1)) == 0) {
            return true;
        }
        return false;
    }

    /**
     * 第一种算法：循环做余数与除法，判断一个数是否是2的N次方，算法效率比较低
     *
     * @param num
     * @return
     */
    private static boolean jude(long num) {
        while (num > 0) {
            if (num == 1) {
                return true;
            }
            if (num % 2 == 0) {
                num = num / 2;
            } else {
                return false;
            }
        }
        return true;
    }
}
